/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.locacao.presenter;

import br.com.webhomesites.locacao.contracts.IDevolucaoTotComRenovPresenter;
import br.com.webhomesites.locacao.contracts.IDevolucaoTotComRenovView;
import br.com.webhomesites.locacao.model.*;
import br.com.webhomesites.padrao.utils.ManipuladorDatas;
import br.com.webhomesites.padrao.utils.Strategy;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Webhome
 */
public class DevolucaoTotComRenovPresenter implements IDevolucaoTotComRenovPresenter {

    private RenovacaoLocacaoModel renovacaoLocacaoModel;
    private IDevolucaoTotComRenovView view;
    private RenovacaoLocacaoDAO renovacaoLocacaoDAO;
    private LocacaoModel locacaoModel;
    private LocacaoDAO locacaoDAO;
    private List<ItemLocacaoModel> listaItemLocacaoModel = new ArrayList<>();
    private ItemLocacaoDAO itemLocacaoDAO = new ItemLocacaoDAO();
    public final Strategy CONFIRMAR_STRATEGY = new ConfirmarStrategy();
    private Strategy operacao = CONFIRMAR_STRATEGY;
    DevolucaoPresenter devolucaoPresenter;
    DecimalFormat df = new DecimalFormat("###,###,##0.00");
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    LocacaoBO locacaoBO;

    public DevolucaoTotComRenovPresenter(RenovacaoLocacaoModel renovacaoLocacaoModel, IDevolucaoTotComRenovView view, LocacaoModel locacaoModel, LocacaoDAO locacaoDAO) {
        this.renovacaoLocacaoModel = renovacaoLocacaoModel;
        this.view = view;
        this.locacaoModel = locacaoModel;
        this.locacaoDAO = locacaoDAO;
        this.renovacaoLocacaoDAO = new RenovacaoLocacaoDAO();
        this.locacaoBO = new LocacaoBO();
    }

    @Override
    public void setUpViewListeners() {
        view.setConfirmarActionListener(new DevolucaoTotComRenovPresenterActionListeners.ConfirmarActionListener(this));
        view.setCancelarActionListener(new DevolucaoTotComRenovPresenterActionListeners.CancelarActionListener(this));
        view.setReciboActionListener(new DevolucaoTotComRenovPresenterActionListeners.ReciboActionListener(this));
        view.setDescontoActionListener(new DevolucaoGenericPresenterActionListener.EnterListener(null, this, null));
        view.setDescontoValorFocusListener(new DevolucaoGenericPresenterActionListener.LostFocusListener(null, this, null));
        view.setDescontoPorcentoFocusListener(new DevolucaoGenericPresenterActionListener.LostFocusListener(null, this, null));
        view.setDiasLocacaoRenovacaoActionListener(new DevolucaoGenericPresenterActionListener.EnterListener(null, this, null));
    }

    @Override
    public void updateViewFromAutomatismo() {

        try {

            view.setValorDescontoValor("0.00");
            view.setValorDescontoPorcentagem("0.00");
            view.setDataPagamento(formatter.format(ManipuladorDatas.getDataAtual()));

            view.setDataRenovavao(formatter.format(ManipuladorDatas.getDataAtual()));
            view.setDiasLocacaoRenovacao(7);
            LocacaoBO.calcularDataPrevDevolucao(null, this);
            view.setValorTotalRenovacao(df.format(DevolucaoBO.calcularValorAPagar(locacaoModel.getValorTotalPrevisto(), locacaoModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas((Date) formatter.parse(view.getDataRenovavao()), (Date) formatter.parse(view.getDataPrevDevolucaoRenovacao())))));


        } catch (ParseException ex) {
            Logger.getLogger(DevolucaoTotComRenovPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void updateViewFromLocacaoModel() {

        try {
            listaItemLocacaoModel = itemLocacaoDAO.findByIdLocacao(locacaoModel.getId());
        
            locacaoModel = DevolucaoBO.calcularDevolucaoParcialLocacao(listaItemLocacaoModel, locacaoModel);
            
            view.setDataLocacao(formatter.format(locacaoModel.getDataLocacao()));
            view.setDiasLocacaoAtual(locacaoModel.getDiasLocacao());
            view.setDataPrevDevolucaoAtual(formatter.format(locacaoModel.getDataPrevDevolucao()));
            view.setValorTotalLocacaoPrevisto(df.format(locacaoModel.getValorParcialPrevisto()));

            view.setDiasLocacaoCalculado(ManipuladorDatas.diferencaEntreDatas(locacaoModel.getDataLocacao(), ManipuladorDatas.getDataAtual()));
            view.setValorTotalLocacaoAtual(df.format(DevolucaoBO.calcularValorAPagar(locacaoModel.getValorParcialPrevisto(), locacaoModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas(locacaoModel.getDataLocacao(), ManipuladorDatas.getDataAtual()))));
            view.setValorTotalPagar(df.format(DevolucaoBO.calcularValorAPagar(locacaoModel.getValorParcialPrevisto(), locacaoModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas(locacaoModel.getDataLocacao(), ManipuladorDatas.getDataAtual()))));

        } catch (Exception e) {
        }
    }

    @Override
    public void updateViewFromRenovacaoLocacaoModel() {

        renovacaoLocacaoModel = renovacaoLocacaoDAO.findLastRenovacaoByIdLocacao(locacaoModel.getId());
        
        listaItemLocacaoModel = itemLocacaoDAO.findByIdLocacao(locacaoModel.getId());
        
        renovacaoLocacaoModel = DevolucaoBO.calcularDevolucaoParcialRenovacao(listaItemLocacaoModel, renovacaoLocacaoModel);

        view.setDataLocacao(formatter.format(renovacaoLocacaoModel.getDataRenovacao()));
        view.setDiasLocacaoAtual(renovacaoLocacaoModel.getDiasLocacao());
        view.setDataPrevDevolucaoAtual(formatter.format(renovacaoLocacaoModel.getDataPrevDevolucao()));
        view.setValorTotalLocacaoPrevisto(df.format(renovacaoLocacaoModel.getValorParcialPrevisto()));

        view.setValorTotalPagar(df.format(DevolucaoBO.calcularValorAPagar(renovacaoLocacaoModel.getValorTotalPrevisto(), renovacaoLocacaoModel.getDiasLocacao(), ManipuladorDatas.diferencaEntreDatas(renovacaoLocacaoModel.getDataRenovacao(), ManipuladorDatas.getDataAtual()))));
        view.setDiasLocacaoCalculado(ManipuladorDatas.diferencaEntreDatas(renovacaoLocacaoModel.getDataRenovacao(), ManipuladorDatas.getDataAtual()));
        view.setValorTotalLocacaoAtual(df.format(renovacaoLocacaoModel.getValorParcialPrevisto()));

    }

    @Override
    public void novoDevolucaoTotComRenov() {

        updateModelLocacaoFromDTCRV();
        updateModelItemLocacaoFromDTCRV();
        updateModelRenovacaoLocacaoFromDTCRV();

    }

    @Override
    public void habilitarEdicao(boolean arg) {
        view.enableTxtValorTotal(arg);
        view.enableTxtValorDesconto(arg);
        view.enableTxtValorTotalPagar(arg);
        view.enableTxtDiasLocacao(arg);
        view.enableComboTabelaPreco(arg);
        view.enableTxtDataRenovacao(arg);
        view.enableTxtDataPrevDevolucao(arg);

        view.enableBtnCancelar(arg);
        view.enableBtnConfirmar(arg);
        view.enableBtnRecibo(arg);
    }

    @Override
    public void updateModelLocacaoFromDTCRV() {

        try {
            locacaoModel.setValorPagar(view.getValorTotalPagar());
            locacaoModel.setValorTotalCalculado(view.getValorTotalPagar());
            locacaoModel.setDiasLocacaoCalculado(view.getDiasLocacaoCalculado());
            locacaoModel.setDescontoValor(view.getValorDescontoValor());
            locacaoModel.setDescontoPorcento(view.getValorDescontoPorcentagem());
            locacaoModel.setDataPagamento((Date) formatter.parse(view.getDataPagamento()));
            locacaoModel.setStatus("A");
            locacaoModel.setPagamento("S");
            locacaoModel.setRenovacao("S");

        } catch (ParseException ex) {
            Logger.getLogger(DevolucaoTotComRenovPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }

        locacaoDAO.update(locacaoModel);
    }

    @Override
    public void updateModelRenovacaoLocacaoFromDTCRV() {

        try {
            renovacaoLocacaoModel = new RenovacaoLocacaoModel();
                       
            renovacaoLocacaoModel.setId(renovacaoLocacaoDAO.getMaxId() + 1);
            renovacaoLocacaoModel.setValorTotalCalculado(0);
            renovacaoLocacaoModel.setLocacaoModel(locacaoModel);

            renovacaoLocacaoModel.setValorTotalPrevisto(view.getValorTotalRenovacao());
            renovacaoLocacaoModel.setDiasLocacao(view.getDiasLocacaoRenovacao());
            renovacaoLocacaoModel.setDataRenovacao((Date) formatter.parse(view.getDataRenovavao()));
            renovacaoLocacaoModel.setDataPrevDevolucao((Date) formatter.parse(view.getDataPrevDevolucaoRenovacao()));

            renovacaoLocacaoModel.setStatus("A");
            renovacaoLocacaoModel.setPagamento("N");
            renovacaoLocacaoModel.setRenovacao("N");

        } catch (ParseException ex) {
            Logger.getLogger(DevolucaoTotComRenovPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }
        renovacaoLocacaoDAO.save(renovacaoLocacaoModel);
        
    }

    @Override
    public void updateModelItemLocacaoFromDTCRV() {

        listaItemLocacaoModel = itemLocacaoDAO.findByIdLocacao(locacaoModel.getId());

        for (ItemLocacaoModel item : listaItemLocacaoModel) {
            item.setDataDevolucao(ManipuladorDatas.getDataAtual());
            item.setDataPagamento(ManipuladorDatas.getDataAtual());
            item.setPagamentoItem("S");
            item.setStatusItem("A");
            item.setRenovacaoItem("N");

            itemLocacaoDAO.update(item);
        }
    }

    @Override
    public IDevolucaoTotComRenovView getView() {
        return view;
    }

    @Override
    public RenovacaoLocacaoModel getModel() {
        return renovacaoLocacaoModel;
    }

    @Override
    public void setView(IDevolucaoTotComRenovView view) {
        this.view = view;
    }

    @Override
    public void setModel(RenovacaoLocacaoModel renovacaoLocacaoModel) {
        this.renovacaoLocacaoModel = renovacaoLocacaoModel;
    }

    @Override
    public void createView() {
        //this.();            
        this.setUpViewListeners();
        this.habilitarEdicao(true);
        view.editableTxtValorTotal(false);
        view.editableTxtValorTotalPagar(false);

        updateViewFromAutomatismo();

        if (locacaoModel.getRenovacao().equals("S")) {
            updateViewFromRenovacaoLocacaoModel();
        } else {
            updateViewFromLocacaoModel();
        }
        view.packAndShow();
    }

    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

    private class ConfirmarStrategy implements Strategy {

        @Override
        public void execute() {
            System.out.println("ConfirmarStrategy");
            novoDevolucaoTotComRenov();
        }
    }
}
